package com.zhss.dfs.server;

import io.grpc.Server;

/**
 * NameNode核心启动类
 * @author zhonghuashishan
 *
 */
public class NameNode {

	/**
	 * 负责管理元数据的核心组件：管理的是一些文件目录树，支持权限设置
	 */
	private FSNamesystem namesystem;
	/**
	 * 负责管理集群中所有的Datanode的组件
	 */
	private DataNodeManager datanodeManager;
	/**
	 * NameNode对外提供rpc接口的server，可以响应请求
	 */
	private NameNodeRpcServer rpcServer;

	/**
	 *  同步backupNode 的fsImage文件
	 */
	private FsImageServer fsImageServer;

	
	/**
	 * 初始化NameNode
	 */
	private void initialize() throws Exception {
		this.datanodeManager = new DataNodeManager();
		this.namesystem = new FSNamesystem(datanodeManager);
		this.rpcServer = new NameNodeRpcServer(this.namesystem, this.datanodeManager);
		this.fsImageServer = new FsImageServer();
	}

	/**
	 * 让NameNode运行起来
	 */
	private void run() {
		try {
			this.fsImageServer.start();
			this.rpcServer.start();
			Server server = this.rpcServer.getServer();
			server.awaitTermination();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
		
	public static void main(String[] args) throws Exception {		
		NameNode namenode = new NameNode();
		namenode.initialize();
		namenode.run();
	}
	
}
